package com.example.entity;


import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONWriter;

/**
 * 通用的Rest接口响应包装类
 * 统一返回结果格式，包括状态码、数据和错误信息
 *
 * @param <T> 返回的数据类型
 * @auth shanyue
 * @date 2025年06月16日8:46
 */
public record RestBean<T>(int code, T data, String message) {

    /**
     * 成功响应的RestBean
     *
     * @param data 返回的数据内容
     * @param <T>  数据类型
     * @return 封装好的RestBean对象
     */
    public static <T> RestBean<T> success(T data) {
        return new RestBean<>(200, data, "请求成功");
    }

    /**
     * 无数据成功响应的RestBean
     *
     * @param <T> 数据类型
     * @return 封装好的RestBean对象
     */
    public static <T> RestBean<T> success() {
        return success(null);
    }

    /**
     * 响应失败的RestBean
     *
     * @param code    状态码
     * @param message 失败信息
     * @param <T>     数据类型
     * @return 封装好的RestBean对象
     */
    public static <T> RestBean<T> failure(int code, String message) {
        return new RestBean<>(code, null, message);
    }

    /**
     * 未登录的RestBean
     * @param message   失败消息
     * @return  封装好的RestBean镀锡
     * @param <T>   数据类型
     */
    public static <T> RestBean<T> unauthorized(String message){
        return failure(401,message);
    }

    /**
     * 没有权限的RestBean
     * @param message   失败消息
     * @return  封装好的RestBean
     * @param <T>   数据类型
     */
    public static <T> RestBean<T> forbidden(String message){
        return failure(403,message);
    }

    /**
     * 将RestBean对象转换为JSON字符串
     *
     * @return JSON格式的字符串
     */
    public String asJSONString() {
        //确保data为null时也能正常输出
        return JSONObject.toJSONString(this, JSONWriter.Feature.WriteNulls);
    }

}
